package Singleton.entity;

//饿汉式，线程安全 但效率比较低
//public class Singleton {
//
//    private static Singleton instance = new Singleton();// 在内部产生本类的实例化对象
//
//    public static Singleton getInstance() { // 通过静态方法返回instance对象
//        return instance;
//    }
//
//    private Singleton() { // 将构造方法封装为私有化
//    }
//
//
//
//    public void print() {
//        System.out.println("Hello World!!!"+word);
//    }
//
//    private String word;
//
//    public String getWord() {
//        return word;
//    }
//
//    public void setWord(String word) {
//        this.word = word;
//    }
//}


//懒汉式,非线程安全，效率可以
//public class Singleton {
//    //私有构造方法
//    private Singleton() {
//
//    }
//
//    private static Singleton instance; //私有化对象
//
//    /**
//     * 懒汉式标准版
//     * 方法控制取对象
//     * 缺点，当大量线程涌入时不安全
//     */
//    public static Singleton getInstance() {
//        if (instance == null) {
//            instance = new Singleton();
//        }
//        return instance;
//    }
//
//    /**
//     * 懒汉式进阶版
//     * 把方法锁住，保证线程安全
//     * 但效率降低
//     * 大量线程涌入时效率不高
//     *
//     * @return
//     */
//    public static synchronized Singleton getSynchronizedInstance() {
//        if (instance == null) {
//            instance = new Singleton();
//        }
//        return instance;
//    }
//
//
//    public void print() {
//        System.out.println("Hello World!!!" + word);
//    }
//
//    private String word;
//
//    public String getWord() {
//        return word;
//    }
//
//    public void setWord(String word) {
//        this.word = word;
//    }
//}



/**
 * 线程安全  并且效率高
 *
 */
public class Singleton {
    //私有化对象
    private static Singleton instance;

    //私有构造方法
    private Singleton() {
    }


    /**
     * 锁住对象，而不是锁住方法
     * 如果进来拿对象：
     * 之前有对象的就拿之前的
     * 没有的话就等锁生成
     *
     *
     * @return
     */
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }



    //以下为实现单例输出效果

    private String word;

    public String getWord() {
        return word;
    }

    public void setWord(String word) {
        this.word = word;
    }
    public void print() {
        System.out.println("Hello World!!!"+word);
    }

}


